package sui.utils.serialnumber;

import java.text.NumberFormat;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;

import sui.utils.date.DateTimeUtils;
import sui.utils.logs.LogUtils;

/**
 * <p>
 * Description: 生成流水号工具类
 * <p>
 * @author XQF SUI
 * @Created: 2016年7月7日 下午3:53:58
 * @version 1.0
 */
public class SerialNumberUtils {
    
    private static Logger logger = LogUtils.get();
    
    /**
     * <p>
     * Description：生成指定位数流水号(自定义流水号)
     * </p>
     * @author XQF SUI
     * @created 2016年7月8日 上午11:32:46
     * @param serialNumber
     * @param digits
     * @return
     */
    public synchronized static String generate(SerialNumber serialNumber, int digits) {
        try {
            return (SerialNumberUtils.formatNumberDigits(serialNumber.getSerialNumber(), digits));
        } catch (Exception e) {
            logger.error("生成流水号失败", e.getMessage());
            return null;
        }
    }

    /**
     * <p>
     * Description：根据当前日期生成指定后缀位数的流水号
     * </p>
     * @author XQF SUI
     * @created 2016年7月7日 下午4:30:59
     * @param digits 后缀位数
     * @return
     */
    public synchronized static String generateByCurrentDate(SerialNumber serialNumber, int digits) {
        try {
            String currentDate = DateTimeUtils.getNowDateShortString();
            return currentDate + (SerialNumberUtils.formatNumberDigits(serialNumber.getSerialNumber(), digits));
        } catch (Exception e) {
            logger.error("生成流水号失败", e.getMessage());
            return null;
        }
    }
    
    /**
     * <p>
     * Description：根据当前日期生成指定前缀和指定后缀位数的流水号
     * </p>
     * @author XQF SUI
     * @created 2016年7月7日 下午4:35:36
     * @param prefix 前缀
     * @param digits 后缀位数
     * @return
     */
    public synchronized static String generateByCurrentDate(SerialNumber serialNumber, String prefix, int digits) {
        String sNumber = generateByCurrentDate(serialNumber, digits);
        
        if (StringUtils.isBlank(sNumber)) return null;
        
        return prefix + sNumber;
    }
    
    /**
     * <p>
     * Description：根据当前时间生成指定后缀位数的流水号
     * </p>
     * @author XQF SUI
     * @created 2016年7月7日 下午4:37:23
     * @param digits 后缀位数
     * @return
     */
    public synchronized static String generateByCurrentTime(SerialNumber serialNumber, int digits) {
        try {
            String currentDate = DateTimeUtils.getNowTimeShortString();
            return currentDate + (SerialNumberUtils.formatNumberDigits(serialNumber.getSerialNumber(), digits));
        } catch (Exception e) {
            logger.error("生成流水号失败", e.getMessage());
            return null;
        }
    }
    
    /**
     * <p>
     * Description：根据当前时间生成指定前缀和指定后缀位数的流水号
     * </p>
     * @author XQF SUI
     * @created 2016年7月7日 下午4:38:09
     * @param prefix 前缀
     * @param digits 后缀位数
     * @return
     */
    public synchronized static String generateByCurrentTime(SerialNumber serialNumber, String prefix, int digits) {
        String sNumber = generateByCurrentTime(serialNumber, digits);
        
        if (StringUtils.isBlank(sNumber)) return null;
        
        return prefix + sNumber;
    }

    /**
     * <p>
     * Description：格式化
     * </p>
     * @author XQF SUI
     * @created 2016年7月7日 下午4:39:16
     * @param number
     * @param digits
     * @return
     */
    private static String formatNumberDigits(int number, int digits) {
        NumberFormat formatter = NumberFormat.getNumberInstance();
        formatter.setMinimumIntegerDigits(digits);
        formatter.setGroupingUsed(false);
        return formatter.format(number);
    }

}

/**
 * <p>
 * Description: 流水号接口类(所有流水号需实现此接口)
 * <p>
 * @author XQF SUI
 * @Created: 2016年7月8日 下午4:26:35
 * @version 1.0
 */
interface SerialNumber {
    public int getSerialNumber();
}